package ewu

import ewu._
import ewu.expressions.ExpArray
import gui._

/**
 * ArrayZuweisung ist eine Zuweisung auf ein Array über den Schlüssel "arrayname".
 * Die Position ist über einen IntWert oder eine Expression bereitzustellen.
 * Ist die Expression nicht auswertbar, wird eine IllegalArgumentException geworfen
 */

case class ArrayZuweisung(arrayname: String, arraypos: Int,
                          arrayposexp: Expression, newValExpr: Expression)
              extends Zuweisung(arrayname, newValExpr) {
                
  def this(arrayname: String, arrayposexpr: Expression, newValExpr: Expression) =
    this (arrayname, -1, arrayposexpr, newValExpr)

  def this(arrayname: String, arraypos: Int, newValExpr: Expression) =
    this (arrayname, arraypos, null, newValExpr)


  override def toString(): String = {
    return HM.numberString(number) ++ arrayname ++ "(" + {
      if (arrayposexp == null)
        arraypos
      else
        arrayposexp
    } + ")" ++ " := " ++ newValExpr.toString ++ ";\n"
  }

  def toString(env: Environment): String = {
    return HM.numberString(number) ++ arrayname ++ "(" + {
      if (arrayposexp == null)
        arraypos
      else
        arrayposexp
    } + ")" ++ " := " ++ newValExpr.toString ++ ";\n"
  }

  override def trace(env: Environment, aenv: ArrayEnvironment, tt: Layout, h: Int):
                                                                  (String, Boolean, Int) = {
    val tmppos: Int = {
      if (arrayposexp == null) {
        arraypos
      } else {
        arrayposexp.evaluate(env) match {
          case Some(x) => x.intValue
          case _ =>
            throw new IllegalArgumentException("Expression not evaluable: " +
                                               aenv.getValue(arrayname).toString)
        }
      }
    }
    
    var array:ExpArray = env.getArray(Name(arrayname)) match {
      case (x:ExpArray) => x
      case _ => null
    }

    var ausgabe: String = toString(env)
    if(array != null) {
      this.newValExpr.evaluate(env) match {
        case Some(newVal) =>
          array.setValue(tmppos, Number(newVal));
          env.setValue(Name(arrayname),array)
        case _ =>
          throw new IllegalArgumentException("Expression not evaluable: " + newValExpr.toString)
      }
    }
    return (ausgabe, true, h+1)
  }
  
}


 